/***
 * 原始数据类型
 */

const a: string = 'joe'

const b: number = 1 // NaN Infinity

const c: boolean = false

// void: undefined | null, 严格模式下，只能是 undefined
const d: void = undefined

const e: symbol = Symbol()

const f: string = '1000'

// 把此文件的变量的作用域设置为模块作用域(即此文件)，预防其他文件中声明了相同的变量名，例如在 2-22-getting.ts 中同样声明了一个 a 变量
export {}

const obj: { foo: string; num: number; [key: string]: any } = {
  bar: 'sss',
  foo: 'joe',
  num: 1,
}

const arr: Array<number> = [12, 1, 3, 4]

//---------------元组--------------

// ---------枚举--------------
enum postStatus {
  aa,
  bb,
  cc,
}

// ---------函数--------------
function fn(a: number, b: string): string {
  return 'aaa'
}
fn(1, '2')

const fn1: (a: number, b: boolean) => string = (c, d) => 'foo'

fn1(1, false)

// ---------any 任意类型--------------
function stringify(value: any): string {
  return JSON.stringify(value)
}

// ---------隐式类型推断--------------
let age = 18 // 隐式推动为number类型
// age = 'string'

// ---------接口--------------
interface Type {
  name: string
  age: number
  // 可选参数
  title?: string
  // 只读成员
  readonly total: number

  [key: string]: any
}

const objInter: Type = {
  name: 'joe',
  age: 20,
  total: 1,
}

objInter.age = 22
// objInter.total = 10
